'''
1.	语料库: B. 收集的用于语言研究和处理的文本数据集合
2.	词库通常包含：A. 词汇的语义信息 B. 词汇的拼写信息 C. 词汇的语法信息
3.	词袋模型的主要特点是：B. 忽略词汇的顺序
4.	n-gram模型中的“n”代表：A. 词汇的个数
5.	n-gram模型中，bigram是指：B. 由两个词汇组成的序列
6.	n-gram模型中，trigram是指：B. 由三个词汇组成的序列
7.	在自然语言处理中，词干还原的主要目的是: C. 减少词汇到其基本形式
8.	词形还原与词干还原的主要区别是：C. 词形还原通常产生词汇的正确形式
9.	在自然语言处理中,词干还原和词形还原的共同点: 都可以减少词汇到其基本形式
10.	非监督语料库不是语料库的类型
11.	词袋模型通常用于： A. 文本分类
12.	词干还原的主要缺点是： A. 可能产生不存在的词汇
13.	在自然语言处理中，n-gram模型的主要应用是：D. 语言模型
14.	词汇表、语法规则、语义信息、拼写信息中，语法规则不是词库的组成部分
15.	在自然语言处理中，词形还原的主要优点是：B. 通常产生词汇的正确形式
16.	语料库的大小常影响:以下所有A.模型的准确性 B.模型的计算成本 C.模型的泛化能力
17.	考虑词汇的顺序、忽略词汇的上下文、基于词汇的出现频率中，考虑词汇的顺序不是词袋模型的特点
18.	文本向量化技术有：词袋模型、TF-IDF、n-gram
19.	TF-IDF的主要作用是：降低常见词汇的权重.
20.	词性标注技术：隐马尔可夫模型（HMM）、条件随机场（CRF）、支持向量机（SVM）
21.	连接主义模型在处理自然语言时，通常使用分布式表征
22.	连接主义模型的特点: 并行处理、层次化结构、需要大量标注数据
23.	在连接主义模型中，反向传播算法主要用于: 参数优化
24.	循环神经网络（RNN）常用于连接主义模型中的序列数据处理
25.	连接主义模型相比于心智计算理论的显著优势: 强大的并行计算能力
26.	正确描述召回率: 召回率也被称为真正率
27.	正确描述精确率: 精确率是真正例的数量除以假正例的数量
28.	二分类问题中，如果模型的召回率是100%，这意味着模型没有错过任何一个真正例
29.	词袋模型和TF-IDF模型都用于：文本分类
30.	词袋模型和TF-IDF模型的主要区别在于：词袋模型不考虑单词的普遍性，TF-IDF模型考虑
31.	在TF-IDF模型中，D.词频-逆文档频率决定了词的重要性
32.	在词袋模型中，A. 词频决定了词的重要性
33.	LSA 是一种基于统计的模型
34.	LSA 的主要目的：A. 减少文本数据的维度
35.	在 LSA 中，SVD（奇异值分解）的作用：用于提取文本数据的潜在语义
36.	LSA 的应用场景：文本分类、信息检索、推荐系统
37.	在 LSA 模型中，如何处理停用词：删除停用词，因为它们不包含有用信息
38.	感知机是一种监督学习算法
39.	感知机模型的目的：找到最佳的超平面来分隔数据
40.	如果数据集是线性可分的，感知机算法：一定会找到一个分隔超平面
41.	反向传播算法主要用于：前馈神经网络、卷积神经网络、循环神经网络
42.	在反向传播算法中，梯度下降的目的：最小化损失函数
43.	Word2vec是一种什么类型的模型：基于神经网络的模型
44.	Word2vec模型的主要目的：将文本数据转换为高维向量
45.	在word2vec中，CBOW模型的全称：Continuous Bag-of-Words
46.	在word2vec中，如何处理罕见词：对罕见词进行抽样处理
47.	知识图谱通常用于表示：C.知识图谱通常用于
48.	在知识图谱中，图数据库的目的：A. 存储和查询知识图谱中的数据
49.	命名实体识别（NER）的主要任务是识别文本中的: C. 实体及其类型
50.	常用于命名实体识别: A.隐马尔可夫模型（HMM）B. 条件随机场（CRF）C. 递归神经网络（RNN）
51.	在构建问答系统时，常用于答案抽取的技术:B. 语义解析 C. 机器学习 D. 知识图谱(信息检索不常用)
'''

'''
1.	语料库: B. 收集的用于语言研究和处理的文本数据集合
2.	词库通常包含：A. 词汇的语义信息 B. 词汇的拼写信息 C. 词汇的语法信息
3.	词袋模型的主要特点是：B. 忽略词汇的顺序
4.	n-gram模型中的“n”代表：A. 词汇的个数
5.	n-gram模型中，bigram是指：B. 由两个词汇组成的序列
6.	n-gram模型中，trigram是指：B. 由三个词汇组成的序列
7.	在自然语言处理中，词干还原的主要目的是: C. 减少词汇到其基本形式
8.	词形还原与词干还原的主要区别是：C. 词形还原通常产生词汇的正确形式
9.	在自然语言处理中,词干还原和词形还原的共同点: 都可以减少词汇到其基本形式
10.	非监督语料库不是语料库的类型
11.	词袋模型通常用于： A. 文本分类
12.	词干还原的主要缺点是： A. 可能产生不存在的词汇
13.	在自然语言处理中，n-gram模型的主要应用是：D. 语言模型
14.	词汇表、语法规则、语义信息、拼写信息中，语法规则不是词库的组成部分
15.	在自然语言处理中，词形还原的主要优点是：B. 通常产生词汇的正确形式
16.	语料库的大小常影响:以下所有A.模型的准确性 B.模型的计算成本 C.模型的泛化能力
17.	考虑词汇的顺序、忽略词汇的上下文、基于词汇的出现频率中，考虑词汇的顺序不是词袋模型的特点
18.	文本向量化技术有：词袋模型、TF-IDF、n-gram
19.	TF-IDF的主要作用是：降低常见词汇的权重.
20.	词性标注技术：隐马尔可夫模型（HMM）、条件随机场（CRF）、支持向量机（SVM）
21.	连接主义模型在处理自然语言时，通常使用分布式表征
22.	连接主义模型的特点: 并行处理、层次化结构、需要大量标注数据
23.	在连接主义模型中，反向传播算法主要用于: 参数优化
24.	循环神经网络（RNN）常用于连接主义模型中的序列数据处理
25.	连接主义模型相比于心智计算理论的显著优势: 强大的并行计算能力
26.	正确描述召回率: 召回率也被称为真正率
27.	正确描述精确率: 精确率是真正例的数量除以假正例的数量
28.	二分类问题中，如果模型的召回率是100%，这意味着模型没有错过任何一个真正例
29.	词袋模型和TF-IDF模型都用于：文本分类
30.	词袋模型和TF-IDF模型的主要区别在于：词袋模型不考虑单词的普遍性，TF-IDF模型考虑
31.	在TF-IDF模型中，D.词频-逆文档频率决定了词的重要性
32.	在词袋模型中，A. 词频决定了词的重要性
33.	LSA 是一种基于统计的模型
34.	LSA 的主要目的：A. 减少文本数据的维度
35.	在 LSA 中，SVD（奇异值分解）的作用：用于提取文本数据的潜在语义
36.	LSA 的应用场景：文本分类、信息检索、推荐系统
37.	在 LSA 模型中，如何处理停用词：删除停用词，因为它们不包含有用信息
38.	感知机是一种监督学习算法
39.	感知机模型的目的：找到最佳的超平面来分隔数据
40.	如果数据集是线性可分的，感知机算法：一定会找到一个分隔超平面
41.	反向传播算法主要用于：前馈神经网络、卷积神经网络、循环神经网络
42.	在反向传播算法中，梯度下降的目的：最小化损失函数
43.	Word2vec是一种什么类型的模型：基于神经网络的模型
44.	Word2vec模型的主要目的：将文本数据转换为高维向量
45.	在word2vec中，CBOW模型的全称：Continuous Bag-of-Words
46.	在word2vec中，如何处理罕见词：对罕见词进行抽样处理
47.	知识图谱通常用于表示：C.知识图谱通常用于
48.	在知识图谱中，图数据库的目的：A. 存储和查询知识图谱中的数据
49.	命名实体识别（NER）的主要任务是识别文本中的: C. 实体及其类型
50.	常用于命名实体识别: A.隐马尔可夫模型（HMM）B. 条件随机场（CRF）C. 递归神经网络（RNN）
51.	在构建问答系统时，常用于答案抽取的技术:B. 语义解析 C. 机器学习 D. 知识图谱(信息检索不常用)



简答
	词干还原（Stemming）作用，给出一个例子和优缺点。
目的：获取单词的核心部分，通常是通过删除词缀来实现的。
方法：使用简单的规则来去除单词的后缀或前缀
结果：可能不会生成一个真正意义上的单词，但可以简化词汇为词根形式
e.g. running还原为run

优：快速(规则简单，处理速度快)、简单、有效(提高召回率)
缺：不准确(可能会生成错误的词)、忽略语境


	词形还原，作用，给出一个例子和优缺点
目的：将单词转换为基本形式
方法：依赖于词汇和语法规则，考虑上下文和词性信息
结果：省测一个标准词典形式的词
e.g. running还原为run，is还原为be

优：准确、考虑语境
缺：慢(需要很多的语言知识和数据库支持，处理慢)、复杂(需要复杂算法和大量语言资源)


	词性归并，作用，给出一个例子和优缺点
目的：为文本中的每个单词标注词性
方法：使用统计模型或规则来预测单词词性
结果：每个单词都会被标注上相应的词性标签
e.g. The cat is ……. 中cat被标记为名词NN，is被标记为动词VB

优：丰富信息(提供丰富的语法信息)、提高精度
缺：难道高、依赖性(效果很大程度依赖于前期的标注质量)


	词干还原、词形还原和词性归并的异同点和关联关系。
相同点：
	目标：三者都是为了更好的理解和处理文本数据
	工具和库：NLP工具和库中，如NLTK、spaCy
不同点：
	目标：词干还原和词性还原为了简化词汇，词性并归为了标注词性
	方法：词干还原和词性还原是词汇归一化的方法，词性并归是标注技术
	
	
	齐普夫定律（Zipf's Law）的应用，给出一个例子。
该定律是一个重要的统计定律，描述了词汇在文本中的频率分布：一个词在文本中的频率与它在频率排名中的位置成反比。即排名越靠前的词出现频率越高，但出现频率下降的非常快。
f*r=k，f是频率，r是排名，k是常数


	词袋模型和TF-IDF模型的联系和区别
联系：
两者都有一种文档表示方法，将文档转化为一个数字矩阵，每行代表一个文档，每列代表一个单词
	 	都用来文本分析和信息检索
区别：
	词袋模型特点：不考虑单词在文档的顺序、语义关系

TF-IDF特点：考虑单词在文档中的频率(TF)、在整个文档集合中的普遍性(IDF)、通过计算TF与IDF的乘积，得到每个单词在文档中的TF-IDF值，反应单词在文档中的重要性和区分度

应用场景：词袋模型适用于简单的文本分析和信息检索任务，如简单文本分类
		  TF与IDF适用于复杂的上述任务，如高级文本分类。文本相似度计算。文本聚类



	Word2Vec和LSA 联系与区别
都用于文本分析算法都用于，处理文本数据，尤其是语义表示方面各有特点
联系：
	降维技术：Word2Vec和LSA都用于将词表示为向量，可以捕捉词之间的语义关系
	上下文信息：两者都考虑了词的上下文信息。通过上下文来推测词的语义
区别：
	算法原理：
LSA：基于奇异值(SVD)的统计方法，分析大量文本中的词频率数据，建立词-文档矩阵，使用SVD进行矩阵分解，找词与文档之间的潜在关系
		Word2Vec：一种神经网络模型，包括CBOW、Skip-Gram
	上下文使用：
		LSA：以来全局的词频统计，考虑整个文档集合中词的共现信息
		Word2Vec：以来局部的上下文窗口，通过窗口内的词序列预测中心词
	计算复杂度：
		LSA：使用SVD复杂度较高
		Word2Vec：训练神经网络的计算效率通常高于SVD
	向量表示：
		LSA：产生的向量空间是稀疏的
		Word2Vec：产生向量空间密集



	CBOW(continuous Bag of words)模型基本原理
一种基于上下文信息的单词表示方式。基本原理是通过计算一个单词周围的上下文来预测中心单词。在训练过程中，CBOW模型将上下文单词的向量表示加在一起，然后通过一个神经网络层处理，得到中心单词的向量表示
训练步骤：
	数据预处理、构建上下文窗口、输入层、隐藏层、输出层。反向传播和梯度下降
	
	
	Skip-GrAM模型基本原理
一种基于上下文信息的单词表示方式。基本原理是通过预测一个单词周围的上下文单词来训练模型。在训练过程中，该模型将中心词的向量通过一个神经网络层处理，生成上下文单词的向量表示。
训练步骤：
	数据预处理、构建上下文窗口、输入层、隐藏层、输出层。反向传播和梯度下降
	
	
	CBOW与Skip-Gram联系与区别
联系：
都是Word2vec的一部分，都用于学习单词的语义信息，并将单词映射到连续的向量空间中。
都是通过上下文信息来学习单词之间的语义关系，并转化为词向量。


	SVD 
左奇异向量：U(6*6)
奇异值向量：S(6*11)
右奇异向量：V^T(11*11)


	知识图谱：
知识图谱是一种用于表示只是的图形化结构，由一系列实体和它们之间的关系组成。


正则表达式题
	基本规则：
		字符匹配：[..]匹配方括号内的任意字符 [^..]匹配不在方括号内的任意字符
		
\d匹配任意数字 -> [0-9]
				  \D匹配非数字字符-> [^0-9]
                  \w匹配任意字母数字字符-> [a-zA-Z0-9_]
				  \W匹配非任意字母数字字符-> [^a-zA-Z0-9_]
				  \s匹配任意空白字符(空格、制表符、换行符等)
				  \S匹配任意非空白字符
				  
量词：
	{m,n}匹配前面的子表达式至少m次，不超过n次
	
定位符：
	^匹配字符串开头
	$匹配字符串末尾
	\b匹配单词边界
	\B匹配非边界
	
字面量字符：表示自己本身(如$ * + @ ……)

	电子邮件匹配：
\w+@\w+\.[a-zA-Z]{2,3} 
解释：\w+匹配一个或多个字母、数字或下划线，表示用户名部分

	匹配电话号码
^ (\d{3}\[.-]){2} \d{4} $
^ [\(\d{3}\)] \d{3} \-\d{4} $

	匹配IPV4地址
\b (?:[0-9]{1,3}\.){3} [0-9]{1,3} \b

	匹配17位身份证号码
^ \d{17}[\dXx] $

	匹配日期(确保可处理闰年和每月的天数)
^(?:(?:31(\/)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:29(\/)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$





计算题
	独热向量长度计算
        假设一个词酷中有8个独热词，每个词的独热向量长度是多少？
	    独热向量的长度等于词库中独热词的数量
	    
	词袋模型向量计算
        给定词汇表如{“apple”，“banana”，“cherry”}和一个文本“apple banana cherry apple”,计算该文本词袋向量？
	    [2,1,1]
	    
	 独热编码计算
        将每个分类变量转换为一个只包含0和1的向量，其中对应于分类变量的索引位置为1，其余位置为0。如[“cat”,”dog”,”rabbit”]，使用独热编码转化为
        “cat”：[1,0,0]
        “dog”：[0,1,0]
        “rabbit”：[0,0,1]
    
	 TD-IDF加权计算
        (某个词在文档中出现的次数与文档总词数的比例)
        一个文档集合有10个文档，apple出现在5个文档中，则词频TF为10。计算IDF
        IDF=lg（文档总数/包含该词的文档数）
        IDF=lg⁡(文档总数/包含该词的文档数)，即IDF=lg(10/5)=0.3,词频为10，则TF-IDF加权值为3

编程题
	实现一个简单的词频统计程序：统计一个文本文件中每个单词的出现频率，并输出出现次数最多的10个单词及其频率。
from collections import Counter
import re
def word_frequency(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        text = file.read().lower()
        words = re.findall(r'\b\w+\b', text)
        word_counts = Counter(words)
        most_common_words = word_counts.most_common(10)
        return most_common_words
file_path = 'example.txt'  # 替换为你的文本文件路径
print(word_frequency(file_path))
	
	实现一个文本分类器，用朴素贝叶斯分类器对一组文本文档进行分类。提供已标注的训练数据和未标注的测试数据，训练一个分类器，并对测试数据进行分类。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score 
# 示例数据用于文本分类
train_data = [
    "这是一个好消息",
    "今天天气真好",
    "我感到非常开心",
    "他看起来很生气",
    "这个电影很无聊",
    "她笑得很灿烂",
    "我很失望",
    "这个地方很美",
    "他表现得很好",
    "我很累"
]
train_labels = [1, 1, 1, 0, 0, 1, 0, 1, 1, 0]  # 1 表示正面评论，0 表示负面评论
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(train_data, train_labels, test_size=0.2, random_state=42)
# 创建一个管道，包括向量化和朴素贝叶斯分类器
model = make_pipeline(CountVectorizer(), MultinomialNB())
# 训练模型
model.fit(X_train, y_train)
# 对测试数据进行预测
predictions = model.predict(X_test)
# 打印预测结果
print(predictions)
# 评估模型
accuracy = accuracy_score(y_test, predictions)
print(f'Accuracy: {accuracy}')

	实现文本摘要生成器，使用TF-IDF（Term Frequency-Inverse Document Frequency）技术从输入的文本文档中提取关键句子，生成摘要
from sklearn.feature_extraction.text 
import TfidfVectorizer 
import numpy as np 
def generate_summary(text, top_n=5):     
    # 分句
    sentences = text.split('.')     
    sentences = [s.strip() for s in sentences if s]     
    # 计算TF-IDF     
    vectorizer = TfidfVectorizer()     
    tfidf_matrix = vectorizer.fit_transform(sentences)     
    # 选择得分最高的句子     
    sum_weights = np.sum(tfidf_matrix, axis=1)     
    top_indices = sum_weights.argsort(axis=0)[-top_n:][::-1]     
    summary = '. '.join([sentences[i[0, 0]] for i in top_indices])     
    return summary 
# 示例文本 
text = "Natural language processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence concerned with the interactions between computers and human (natural) languages, in particular how to program computers to process and analyze large amounts of natural language data. The goal is a computer capable of understanding the contents of documents, reports, articles, etc., and answering questions based on it. Research in NLP includes many different tasks such as text segmentation, sentence breaking, tokenization, part-of-speech tagging, lemmatization, parsing, text summarization, machine translation, and natural language understanding." # 生成摘要 print(generate_summary(text))
	 
	 构建一个基于朴素贝叶斯的垃圾邮件分类器，区分垃圾邮箱和正常邮箱
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
# 假设emails是一个包含邮件内容和标签的列表
emails = [
    ("Congratulations! You've won a $1000 gift card!", 'spam'),
    ("Meet me tomorrow at the office.", 'ham'),
    ("Enlarge your penis naturally!", 'spam'),
    ("Let's go for lunch after the meeting.", 'ham'),
    ("Special offer: Buy one get one free!", 'spam'),
    ("I need the report by Friday.", 'ham'),
    ("Your bank account requires immediate attention.", 'spam'),
    ("Can we reschedule our appointment?", 'ham'),
    ("Urgent: You've been selected to receive a grant!", 'spam'),
    ("Don't forget the team-building event next week.", 'ham')
]

# 分割数据集
emails_text = [email[0] for email in emails]
emails_labels = [email[1] for email in emails]
X_train, X_test, y_train, y_test = train_test_split(emails_text, emails_labels, test_size=0.2)
# 将文本转换为特征向量
vectorizer = CountVectorizer()
X_train_counts = vectorizer.fit_transform(X_train)
# 训练朴素贝叶斯分类器
classifier = MultinomialNB()
classifier.fit(X_train_counts, y_train)
# 测试集转换为特征向量
X_test_counts = vectorizer.transform(X_test)
# 进行预测
y_pred = classifier.predict(X_test_counts)
# 计算准确率
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')

	实现一个简单的聊天机器人：根据用户输入生成相应的回复。使用一个简单的基于规则的系统，根据关键词或短语匹配来生成回复。
def chat_bot(input_text):
    # 定义一个简单的基于规则的回复字典
    responses = {
        'hello': 'Hi there!',
        'how are you': 'I\'m doing well, thanks!',
        'bye': 'Goodbye!',
        'tell me about yourself': 'I am a simple chat bot designed to answer your questions.',
    }
    # 分词
    input_words = input_text.lower().split()
    # 查找匹配的回复
    for word in input_words:
        if word in responses:
            return responses[word]
    # 如果没有找到匹配的回复，返回默认回复
    return 'I\'m not sure how to respond to that.'
# 用户输入
user_input = input("You: ")
print(f"Chat Bot: {chat_bot(user_input)}")


'''
